// See LICENSE for license details_

#ifndef RISCV_CSR_ENCODING_H
#define RISCV_CSR_ENCODING_H

#define MISA_D (1u << 3u)
#define MISA_F (1u << 5u)

#define MSTATUS_UIE         0x00000001
#define MSTATUS_SIE         0x00000002
#define MSTATUS_HIE         0x00000004
#define MSTATUS_MIE         0x00000008
#define MSTATUS_UPIE        0x00000010
#define MSTATUS_SPIE        0x00000020
#define MSTATUS_HPIE        0x00000040
#define MSTATUS_MPIE        0x00000080
#define MSTATUS_SPP         0x00000100
#define MSTATUS_HPP         0x00000600
#define MSTATUS_MPP         0x00001800
#define MSTATUS_MPS         0x00000600
#define MSTATUS_FS          0x00006000
#define MSTATUS_XS          0x00018000
#define MSTATUS_MPRV        0x00020000
#define MSTATUS_SUM         0x00040000
#define MSTATUS_MXR         0x00080000
#define MSTATUS_TVM         0x00100000
#define MSTATUS_TW          0x00200000

#define MCAUSE_INTFLG       0x80000000
#define MCAUSE_MINHV        0x40000000
#define MCAUSE_MPP          0x30000000
#define MCAUSE_MPIE         0x08000000
#define MCAUSE_MPIL         0x00FF0000
#define MCAUSE_CODE         0x00000FFF

#define MXSTATUS_TYP        0x000000C0
#define MXSTATUS_PTY        0x00000300


#define MSTATUS_TSR         0x00400000
#define MSTATUS32_SD        0x80000000
#define MSTATUS_UXL         0x0000000300000000
#define MSTATUS_SXL         0x0000000C00000000
#define MSTATUS64_SD        0x8000000000000000

#define SSTATUS_UIE         0x00000001
#define SSTATUS_SIE         0x00000002
#define SSTATUS_UPIE        0x00000010
#define SSTATUS_SPIE        0x00000020
#define SSTATUS_SPP         0x00000100
#define SSTATUS_FS          0x00006000
#define SSTATUS_XS          0x00018000
#define SSTATUS_SUM         0x00040000
#define SSTATUS_MXR         0x00080000
#define SSTATUS32_SD        0x80000000
#define SSTATUS_UXL         0x0000000300000000
#define SSTATUS64_SD        0x8000000000000000

#define SCAUSE_INTFLG       0x80000000
#define SCAUSE_SINHV        0x40000000
#define SCAUSE_SPP          0x10000000
#define SCAUSE_SPIE         0x08000000
#define SCAUSE_SPIL         0x00FF0000
#define SCAUSE_CODE         0x00000FFF


#define ISTATUS_MPIE        0x00000080
#define ISTATUS_MPS         0x00000600
#define ISTATUS_MPP         0x00001800

#define NSTATUS_MPIE        0x00000080
#define NSTATUS_MPS         0x00000600
#define NSTATUS_MPP         0x00001800



#define DCSR_XDEBUGVER      (3U<<30)
#define DCSR_NDRESET        (1<<29)
#define DCSR_FULLRESET      (1<<28)
#define DCSR_EBREAKM        (1<<15)
#define DCSR_EBREAKH        (1<<14)
#define DCSR_EBREAKS        (1<<13)
#define DCSR_EBREAKU        (1<<12)
#define DCSR_STOPCYCLE      (1<<10)
#define DCSR_STOPTIME       (1<<9)
#define DCSR_CAUSE          (7<<6)
#define DCSR_DEBUGINT       (1<<5)
#define DCSR_HALT           (1<<3)
#define DCSR_STEP           (1<<2)
#define DCSR_PRV            (3<<0)

#define DCSR_CAUSE_NONE     0
#define DCSR_CAUSE_SWBP     1
#define DCSR_CAUSE_HWBP     2
#define DCSR_CAUSE_DEBUGINT 3
#define DCSR_CAUSE_STEP     4
#define DCSR_CAUSE_HALT     5

#define MCONTROL_TYPE(xlen)    (0xfULL<<((xlen)-4))
#define MCONTROL_DMODE(xlen)   (1ULL<<((xlen)-5))
#define MCONTROL_MASKMAX(xlen) (0x3fULL<<((xlen)-11))

#define MCONTROL_SELECT     (1<<19)
#define MCONTROL_TIMING     (1<<18)
#define MCONTROL_ACTION     (0x3f<<12)
#define MCONTROL_CHAIN      (1<<11)
#define MCONTROL_MATCH      (0xf<<7)
#define MCONTROL_M          (1<<6)
#define MCONTROL_H          (1<<5)
#define MCONTROL_S          (1<<4)
#define MCONTROL_U          (1<<3)
#define MCONTROL_EXECUTE    (1<<2)
#define MCONTROL_STORE      (1<<1)
#define MCONTROL_LOAD       (1<<0)

#define MCONTROL_TYPE_NONE      0
#define MCONTROL_TYPE_MATCH     2

#define MCONTROL_ACTION_DEBUG_EXCEPTION   0
#define MCONTROL_ACTION_DEBUG_MODE        1
#define MCONTROL_ACTION_TRACE_START       2
#define MCONTROL_ACTION_TRACE_STOP        3
#define MCONTROL_ACTION_TRACE_EMIT        4

#define MCONTROL_MATCH_EQUAL     0
#define MCONTROL_MATCH_NAPOT     1
#define MCONTROL_MATCH_GE        2
#define MCONTROL_MATCH_LT        3
#define MCONTROL_MATCH_MASK_LOW  4
#define MCONTROL_MATCH_MASK_HIGH 5

#define MIP_USIP            (1 << IRQ_U_SOFT)
#define MIP_SSIP            (1 << IRQ_S_SOFT)
#define MIP_HSIP            (1 << IRQ_H_SOFT)
#define MIP_MSIP            (1 << IRQ_M_SOFT)
#define MIP_UTIP            (1 << IRQ_U_TIMER)
#define MIP_STIP            (1 << IRQ_S_TIMER)
#define MIP_HTIP            (1 << IRQ_H_TIMER)
#define MIP_MTIP            (1 << IRQ_M_TIMER)
#define MIP_UEIP            (1 << IRQ_U_EXT)
#define MIP_SEIP            (1 << IRQ_S_EXT)
#define MIP_HEIP            (1 << IRQ_H_EXT)
#define MIP_MEIP            (1 << IRQ_M_EXT)
#define MIP_BWEI            (1 << IRQ_BUS)
#define MIP_PMOVI           (1 << IRQ_PMOV)

#define SIP_SSIP MIP_SSIP
#define SIP_STIP MIP_STIP

#define PRV_U 0
#define PRV_S 1
#define PRV_H 2
#define PRV_M 3

// CAI: counteren bit field_
#define MCOUNTEREN_CY    0x1
#define MCOUNTEREN_TM    0x2
#define MCOUNTEREN_IR    0x4
#define MCOUNTEREN_HPM3  0x8
#define MCOUNTEREN_HPM4  0x10
#define MCOUNTEREN_HPM5  0x20
#define MCOUNTEREN_HPM6  0x40

// N extension

#define USTATUS_UIE         0x00000001
#define USTATUS_UPIE        0x00000010
#define UIE_USIE            0x00000001
#define UIE_UTIE            0x00000010
#define UIE_UEIE            0x00000100
#define UIP_USIP            0x00000001
#define UIP_UTIP            0x00000010
#define UIP_UEIP            0x00000100
#define UCAUSE_INTFLG       0x80000000
#define UCAUSE_UINHV        0x40000000
#define UCAUSE_UPIE         0x08000000
#define UCAUSE_UPIL         0x00FF0000
#define UCAUSE_CODE         0x00000FFF

#define SPTBR32_MODE 0x80000000
#define SPTBR32_ASID 0x7FC00000
#define SPTBR32_PPN  0x003FFFFF
#define SPTBR64_MODE 0xF000000000000000
#define SPTBR64_ASID 0x0FFFF00000000000
#define SPTBR64_PPN  0x00000FFFFFFFFFFF

#define SPTBR_MODE_OFF  0
#define SPTBR_MODE_SV32 1
#define SPTBR_MODE_SV39 8
#define SPTBR_MODE_SV48 9
#define SPTBR_MODE_SV57 10
#define SPTBR_MODE_SV64 11

#define PMP_R     0x01
#define PMP_W     0x02
#define PMP_X     0x04
#define PMP_A     0x18
#define SPMP_U    0x40
#define PMP_L     0x80
#define PMP_SHIFT 2

#define PMP_TOR   0x08
#define PMP_NA4   0x10
#define PMP_NAPOT 0x18

#define IRQ_U_SOFT   0
#define IRQ_S_SOFT   1
#define IRQ_H_SOFT   2
#define IRQ_M_SOFT   3
#define IRQ_U_TIMER  4
#define IRQ_S_TIMER  5
#define IRQ_H_TIMER  6
#define IRQ_M_TIMER  7
#define IRQ_U_EXT    8
#define IRQ_S_EXT    9
#define IRQ_H_EXT    10
#define IRQ_M_EXT    11
#define IRQ_COP      12
#define IRQ_HOST     13
#define IRQ_BUS      17
#define IRQ_PMOV     18

#define DEFAULT_RSTVEC     0x00001000
#define CLINT_BASE         0x02000000
#define CLINT_SIZE         0x000c0000
#define EXT_IO_BASE        0x40000000
#define DRAM_BASE          0x60000000
#define DRAM_SIZE          0xA0000000

#define DRAM_BASE_1        0x60000
#define DRAM_SIZE_1        0xA0000

// add by CAI: for self-defined PIC BASE & SIZE
#define PIC_BASE           0x0c000000
#define PIC_SIZE           0x01000000
#define TMR_BASE           0x02000000
#define TMR_SIZE           0x00001000


// page table entry (PTE) fields
#define PTE_V     0x001 // Valid
#define PTE_R     0x002 // Read
#define PTE_W     0x004 // Write
#define PTE_X     0x008 // Execute
#define PTE_U     0x010 // User
#define PTE_G     0x020 // Global
#define PTE_A     0x040 // Accessed
#define PTE_D     0x080 // Dirty
#define PTE_SOFT  0x300 // Reserved for Software

#define PTE_PPN_SHIFT 10

#define PTE_TABLE(PTE) (((PTE) & (PTE_V | PTE_R | PTE_W | PTE_X)) == PTE_V)

#ifdef __riscv

#if __riscv_xlen == 64
# define MSTATUS_SD MSTATUS64_SD
# define SSTATUS_SD SSTATUS64_SD
# define RISCV_PGLEVEL_BITS 9
# define SPTBR_MODE SPTBR64_MODE
#else
# define MSTATUS_SD MSTATUS32_SD
# define SSTATUS_SD SSTATUS32_SD
# define RISCV_PGLEVEL_BITS 10
# define SPTBR_MODE SPTBR32_MODE
#endif
#define RISCV_PGSHIFT 12
#define RISCV_PGSIZE (1 << RISCV_PGSHIFT)

#ifndef __ASSEMBLER__

#ifdef __GNUC__

#define read_csr(reg) ({ unsigned long __tmp; \
  asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \
  __tmp; })

#define write_csr(reg, val) ({ \
  asm volatile ("csrw " #reg ", %0" :: "rK"(val)); })

#define swap_csr(reg, val) ({ unsigned long __tmp; \
  asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "rK"(val)); \
  __tmp; })

#define set_csr(reg, bit) ({ unsigned long __tmp; \
  asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "rK"(bit)); \
  __tmp; })

#define clear_csr(reg, bit) ({ unsigned long __tmp; \
  asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "rK"(bit)); \
  __tmp; })

#define rdtime() read_csr(time)
#define rdcycle() read_csr(cycle)
#define rdinstret() read_csr(instret)

#endif

#endif

#endif

#endif
/* Automatically generated by parse-opcodes_  */
#ifndef RISCV_ENCODING_H
#define RISCV_ENCODING_H
#define MATCH_BEQ 0x63
#define MASK_BEQ  0x707f
#define MATCH_BNE 0x1063
#define MASK_BNE  0x707f
#define MATCH_BLT 0x4063
#define MASK_BLT  0x707f
#define MATCH_BGE 0x5063
#define MASK_BGE  0x707f
#define MATCH_BLTU 0x6063
#define MASK_BLTU  0x707f
#define MATCH_BGEU 0x7063
#define MASK_BGEU  0x707f
#define MATCH_JALR 0x67
#define MASK_JALR  0x707f
#define MATCH_JAL 0x6f
#define MASK_JAL  0x7f
#define MATCH_LUI 0x37
#define MASK_LUI  0x7f
#define MATCH_AUIPC 0x17
#define MASK_AUIPC  0x7f
#define MATCH_ADDI 0x13
#define MASK_ADDI  0x707f
#define MATCH_SLLI 0x1013
#define MASK_SLLI  0xfc00707f
#define MATCH_SLTI 0x2013
#define MASK_SLTI  0x707f
#define MATCH_SLTIU 0x3013
#define MASK_SLTIU  0x707f
#define MATCH_XORI 0x4013
#define MASK_XORI  0x707f
#define MATCH_SRLI 0x5013
#define MASK_SRLI  0xfc00707f
#define MATCH_SRAI 0x40005013
#define MASK_SRAI  0xfc00707f
#define MATCH_ORI 0x6013
#define MASK_ORI  0x707f
#define MATCH_ANDI 0x7013
#define MASK_ANDI  0x707f
#define MATCH_ADD 0x33
#define MASK_ADD  0xfe00707f
#define MATCH_SUB 0x40000033
#define MASK_SUB  0xfe00707f
#define MATCH_SLL 0x1033
#define MASK_SLL  0xfe00707f
#define MATCH_SLT 0x2033
#define MASK_SLT  0xfe00707f
#define MATCH_SLTU 0x3033
#define MASK_SLTU  0xfe00707f
#define MATCH_XOR 0x4033
#define MASK_XOR  0xfe00707f
#define MATCH_SRL 0x5033
#define MASK_SRL  0xfe00707f
#define MATCH_SRA 0x40005033
#define MASK_SRA  0xfe00707f
#define MATCH_OR 0x6033
#define MASK_OR  0xfe00707f
#define MATCH_AND 0x7033
#define MASK_AND  0xfe00707f
#define MATCH_ADDIW 0x1b
#define MASK_ADDIW  0x707f
#define MATCH_SLLIW 0x101b
#define MASK_SLLIW  0xfe00707f
#define MATCH_SRLIW 0x501b
#define MASK_SRLIW  0xfe00707f
#define MATCH_SRAIW 0x4000501b
#define MASK_SRAIW  0xfe00707f
#define MATCH_ADDW 0x3b
#define MASK_ADDW  0xfe00707f
#define MATCH_SUBW 0x4000003b
#define MASK_SUBW  0xfe00707f
#define MATCH_SLLW 0x103b
#define MASK_SLLW  0xfe00707f
#define MATCH_SRLW 0x503b
#define MASK_SRLW  0xfe00707f
#define MATCH_SRAW 0x4000503b
#define MASK_SRAW  0xfe00707f
#define MATCH_LB 0x3
#define MASK_LB  0x707f
#define MATCH_LH 0x1003
#define MASK_LH  0x707f
#define MATCH_LW 0x2003
#define MASK_LW  0x707f
#define MATCH_LD 0x3003
#define MASK_LD  0x707f
#define MATCH_LBU 0x4003
#define MASK_LBU  0x707f
#define MATCH_LHU 0x5003
#define MASK_LHU  0x707f
#define MATCH_LWU 0x6003
#define MASK_LWU  0x707f
#define MATCH_SB 0x23
#define MASK_SB  0x707f
#define MATCH_SH 0x1023
#define MASK_SH  0x707f
#define MATCH_SW 0x2023
#define MASK_SW  0x707f
#define MATCH_SD 0x3023
#define MASK_SD  0x707f
#define MATCH_FENCE 0xf
#define MASK_FENCE  0x707f
#define MATCH_FENCE_I 0x100f
#define MASK_FENCE_I  0x707f
#define MATCH_MUL 0x2000033
#define MASK_MUL  0xfe00707f
#define MATCH_MULH 0x2001033
#define MASK_MULH  0xfe00707f
#define MATCH_MULHSU 0x2002033
#define MASK_MULHSU  0xfe00707f
#define MATCH_MULHU 0x2003033
#define MASK_MULHU  0xfe00707f
#define MATCH_DIV 0x2004033
#define MASK_DIV  0xfe00707f
#define MATCH_DIVU 0x2005033
#define MASK_DIVU  0xfe00707f
#define MATCH_REM 0x2006033
#define MASK_REM  0xfe00707f
#define MATCH_REMU 0x2007033
#define MASK_REMU  0xfe00707f
#define MATCH_MULW 0x200003b
#define MASK_MULW  0xfe00707f
#define MATCH_DIVW 0x200403b
#define MASK_DIVW  0xfe00707f
#define MATCH_DIVUW 0x200503b
#define MASK_DIVUW  0xfe00707f
#define MATCH_REMW 0x200603b
#define MASK_REMW  0xfe00707f
#define MATCH_REMUW 0x200703b
#define MASK_REMUW  0xfe00707f
#define MATCH_AMOADD_W 0x202f
#define MASK_AMOADD_W  0xf800707f
#define MATCH_AMOXOR_W 0x2000202f
#define MASK_AMOXOR_W  0xf800707f
#define MATCH_AMOOR_W 0x4000202f
#define MASK_AMOOR_W  0xf800707f
#define MATCH_AMOAND_W 0x6000202f
#define MASK_AMOAND_W  0xf800707f
#define MATCH_AMOMIN_W 0x8000202f
#define MASK_AMOMIN_W  0xf800707f
#define MATCH_AMOMAX_W 0xa000202f
#define MASK_AMOMAX_W  0xf800707f
#define MATCH_AMOMINU_W 0xc000202f
#define MASK_AMOMINU_W  0xf800707f
#define MATCH_AMOMAXU_W 0xe000202f
#define MASK_AMOMAXU_W  0xf800707f
#define MATCH_AMOSWAP_W 0x800202f
#define MASK_AMOSWAP_W  0xf800707f
#define MATCH_LR_W 0x1000202f
#define MASK_LR_W  0xf9f0707f
#define MATCH_SC_W 0x1800202f
#define MASK_SC_W  0xf800707f
#define MATCH_AMOADD_D 0x302f
#define MASK_AMOADD_D  0xf800707f
#define MATCH_AMOXOR_D 0x2000302f
#define MASK_AMOXOR_D  0xf800707f
#define MATCH_AMOOR_D 0x4000302f
#define MASK_AMOOR_D  0xf800707f
#define MATCH_AMOAND_D 0x6000302f
#define MASK_AMOAND_D  0xf800707f
#define MATCH_AMOMIN_D 0x8000302f
#define MASK_AMOMIN_D  0xf800707f
#define MATCH_AMOMAX_D 0xa000302f
#define MASK_AMOMAX_D  0xf800707f
#define MATCH_AMOMINU_D 0xc000302f
#define MASK_AMOMINU_D  0xf800707f
#define MATCH_AMOMAXU_D 0xe000302f
#define MASK_AMOMAXU_D  0xf800707f
#define MATCH_AMOSWAP_D 0x800302f
#define MASK_AMOSWAP_D  0xf800707f
#define MATCH_LR_D 0x1000302f
#define MASK_LR_D  0xf9f0707f
#define MATCH_SC_D 0x1800302f
#define MASK_SC_D  0xf800707f
#define MATCH_ECALL 0x73
#define MASK_ECALL  0xffffffff
#define MATCH_EBREAK 0x100073
#define MASK_EBREAK  0xffffffff
#define MATCH_URET 0x200073
#define MASK_URET  0xffffffff
#define MATCH_SRET 0x10200073
#define MASK_SRET  0xffffffff
#define MATCH_MRET 0x30200073
#define MASK_MRET  0xffffffff
#define MATCH_DRET 0x7b200073
#define MASK_DRET  0xffffffff
#define MATCH_SFENCE_VMA 0x12000073
#define MASK_SFENCE_VMA  0xfe007fff
#define MATCH_WFI 0x10500073
#define MASK_WFI  0xffffffff
#define MATCH_CSRRW 0x1073
#define MASK_CSRRW  0x707f
#define MATCH_CSRRS 0x2073
#define MASK_CSRRS  0x707f
#define MATCH_CSRRC 0x3073
#define MASK_CSRRC  0x707f
#define MATCH_CSRRWI 0x5073
#define MASK_CSRRWI  0x707f
#define MATCH_CSRRSI 0x6073
#define MASK_CSRRSI  0x707f
#define MATCH_CSRRCI 0x7073
#define MASK_CSRRCI  0x707f
#define MATCH_FADD_S 0x53
#define MASK_FADD_S  0xfe00007f
#define MATCH_FSUB_S 0x8000053
#define MASK_FSUB_S  0xfe00007f
#define MATCH_FMUL_S 0x10000053
#define MASK_FMUL_S  0xfe00007f
#define MATCH_FDIV_S 0x18000053
#define MASK_FDIV_S  0xfe00007f
#define MATCH_FSGNJ_S 0x20000053
#define MASK_FSGNJ_S  0xfe00707f
#define MATCH_FSGNJN_S 0x20001053
#define MASK_FSGNJN_S  0xfe00707f
#define MATCH_FSGNJX_S 0x20002053
#define MASK_FSGNJX_S  0xfe00707f
#define MATCH_FMIN_S 0x28000053
#define MASK_FMIN_S  0xfe00707f
#define MATCH_FMAX_S 0x28001053
#define MASK_FMAX_S  0xfe00707f
#define MATCH_FSQRT_S 0x58000053
#define MASK_FSQRT_S  0xfff0007f
#define MATCH_FADD_D 0x2000053
#define MASK_FADD_D  0xfe00007f
#define MATCH_FSUB_D 0xa000053
#define MASK_FSUB_D  0xfe00007f
#define MATCH_FMUL_D 0x12000053
#define MASK_FMUL_D  0xfe00007f
#define MATCH_FDIV_D 0x1a000053
#define MASK_FDIV_D  0xfe00007f
#define MATCH_FSGNJ_D 0x22000053
#define MASK_FSGNJ_D  0xfe00707f
#define MATCH_FSGNJN_D 0x22001053
#define MASK_FSGNJN_D  0xfe00707f
#define MATCH_FSGNJX_D 0x22002053
#define MASK_FSGNJX_D  0xfe00707f
#define MATCH_FMIN_D 0x2a000053
#define MASK_FMIN_D  0xfe00707f
#define MATCH_FMAX_D 0x2a001053
#define MASK_FMAX_D  0xfe00707f
#define MATCH_FCVT_S_D 0x40100053
#define MASK_FCVT_S_D  0xfff0007f
#define MATCH_FCVT_D_S 0x42000053
#define MASK_FCVT_D_S  0xfff0007f
#define MATCH_FSQRT_D 0x5a000053
#define MASK_FSQRT_D  0xfff0007f
#define MATCH_FADD_Q 0x6000053
#define MASK_FADD_Q  0xfe00007f
#define MATCH_FSUB_Q 0xe000053
#define MASK_FSUB_Q  0xfe00007f
#define MATCH_FMUL_Q 0x16000053
#define MASK_FMUL_Q  0xfe00007f
#define MATCH_FDIV_Q 0x1e000053
#define MASK_FDIV_Q  0xfe00007f
#define MATCH_FSGNJ_Q 0x26000053
#define MASK_FSGNJ_Q  0xfe00707f
#define MATCH_FSGNJN_Q 0x26001053
#define MASK_FSGNJN_Q  0xfe00707f
#define MATCH_FSGNJX_Q 0x26002053
#define MASK_FSGNJX_Q  0xfe00707f
#define MATCH_FMIN_Q 0x2e000053
#define MASK_FMIN_Q  0xfe00707f
#define MATCH_FMAX_Q 0x2e001053
#define MASK_FMAX_Q  0xfe00707f
#define MATCH_FCVT_S_Q 0x40300053
#define MASK_FCVT_S_Q  0xfff0007f
#define MATCH_FCVT_Q_S 0x46000053
#define MASK_FCVT_Q_S  0xfff0007f
#define MATCH_FCVT_D_Q 0x42300053
#define MASK_FCVT_D_Q  0xfff0007f
#define MATCH_FCVT_Q_D 0x46100053
#define MASK_FCVT_Q_D  0xfff0007f
#define MATCH_FSQRT_Q 0x5e000053
#define MASK_FSQRT_Q  0xfff0007f
#define MATCH_FLE_S 0xa0000053
#define MASK_FLE_S  0xfe00707f
#define MATCH_FLT_S 0xa0001053
#define MASK_FLT_S  0xfe00707f
#define MATCH_FEQ_S 0xa0002053
#define MASK_FEQ_S  0xfe00707f
#define MATCH_FLE_D 0xa2000053
#define MASK_FLE_D  0xfe00707f
#define MATCH_FLT_D 0xa2001053
#define MASK_FLT_D  0xfe00707f
#define MATCH_FEQ_D 0xa2002053
#define MASK_FEQ_D  0xfe00707f
#define MATCH_FLE_Q 0xa6000053
#define MASK_FLE_Q  0xfe00707f
#define MATCH_FLT_Q 0xa6001053
#define MASK_FLT_Q  0xfe00707f
#define MATCH_FEQ_Q 0xa6002053
#define MASK_FEQ_Q  0xfe00707f
#define MATCH_FCVT_W_S 0xc0000053
#define MASK_FCVT_W_S  0xfff0007f
#define MATCH_FCVT_WU_S 0xc0100053
#define MASK_FCVT_WU_S  0xfff0007f
#define MATCH_FCVT_L_S 0xc0200053
#define MASK_FCVT_L_S  0xfff0007f
#define MATCH_FCVT_LU_S 0xc0300053
#define MASK_FCVT_LU_S  0xfff0007f
#define MATCH_FMV_X_W 0xe0000053
#define MASK_FMV_X_W  0xfff0707f
#define MATCH_FCLASS_S 0xe0001053
#define MASK_FCLASS_S  0xfff0707f
#define MATCH_FCVT_W_D 0xc2000053
#define MASK_FCVT_W_D  0xfff0007f
#define MATCH_FCVT_WU_D 0xc2100053
#define MASK_FCVT_WU_D  0xfff0007f
#define MATCH_FCVT_L_D 0xc2200053
#define MASK_FCVT_L_D  0xfff0007f
#define MATCH_FCVT_LU_D 0xc2300053
#define MASK_FCVT_LU_D  0xfff0007f
#define MATCH_FMV_X_D 0xe2000053
#define MASK_FMV_X_D  0xfff0707f
#define MATCH_FCLASS_D 0xe2001053
#define MASK_FCLASS_D  0xfff0707f
#define MATCH_FCVT_W_Q 0xc6000053
#define MASK_FCVT_W_Q  0xfff0007f
#define MATCH_FCVT_WU_Q 0xc6100053
#define MASK_FCVT_WU_Q  0xfff0007f
#define MATCH_FCVT_L_Q 0xc6200053
#define MASK_FCVT_L_Q  0xfff0007f
#define MATCH_FCVT_LU_Q 0xc6300053
#define MASK_FCVT_LU_Q  0xfff0007f
#define MATCH_FMV_X_Q 0xe6000053
#define MASK_FMV_X_Q  0xfff0707f
#define MATCH_FCLASS_Q 0xe6001053
#define MASK_FCLASS_Q  0xfff0707f
#define MATCH_FCVT_S_W 0xd0000053
#define MASK_FCVT_S_W  0xfff0007f
#define MATCH_FCVT_S_WU 0xd0100053
#define MASK_FCVT_S_WU  0xfff0007f
#define MATCH_FCVT_S_L 0xd0200053
#define MASK_FCVT_S_L  0xfff0007f
#define MATCH_FCVT_S_LU 0xd0300053
#define MASK_FCVT_S_LU  0xfff0007f
#define MATCH_FMV_W_X 0xf0000053
#define MASK_FMV_W_X  0xfff0707f
#define MATCH_FCVT_D_W 0xd2000053
#define MASK_FCVT_D_W  0xfff0007f
#define MATCH_FCVT_D_WU 0xd2100053
#define MASK_FCVT_D_WU  0xfff0007f
#define MATCH_FCVT_D_L 0xd2200053
#define MASK_FCVT_D_L  0xfff0007f
#define MATCH_FCVT_D_LU 0xd2300053
#define MASK_FCVT_D_LU  0xfff0007f
#define MATCH_FMV_D_X 0xf2000053
#define MASK_FMV_D_X  0xfff0707f
#define MATCH_FCVT_Q_W 0xd6000053
#define MASK_FCVT_Q_W  0xfff0007f
#define MATCH_FCVT_Q_WU 0xd6100053
#define MASK_FCVT_Q_WU  0xfff0007f
#define MATCH_FCVT_Q_L 0xd6200053
#define MASK_FCVT_Q_L  0xfff0007f
#define MATCH_FCVT_Q_LU 0xd6300053
#define MASK_FCVT_Q_LU  0xfff0007f
#define MATCH_FMV_Q_X 0xf6000053
#define MASK_FMV_Q_X  0xfff0707f
#define MATCH_FLW 0x2007
#define MASK_FLW  0x707f
#define MATCH_FLD 0x3007
#define MASK_FLD  0x707f
#define MATCH_FLQ 0x4007
#define MASK_FLQ  0x707f
#define MATCH_FSW 0x2027
#define MASK_FSW  0x707f
#define MATCH_FSD 0x3027
#define MASK_FSD  0x707f
#define MATCH_FSQ 0x4027
#define MASK_FSQ  0x707f
#define MATCH_FMADD_S 0x43
#define MASK_FMADD_S  0x600007f
#define MATCH_FMSUB_S 0x47
#define MASK_FMSUB_S  0x600007f
#define MATCH_FNMSUB_S 0x4b
#define MASK_FNMSUB_S  0x600007f
#define MATCH_FNMADD_S 0x4f
#define MASK_FNMADD_S  0x600007f
#define MATCH_FMADD_D 0x2000043
#define MASK_FMADD_D  0x600007f
#define MATCH_FMSUB_D 0x2000047
#define MASK_FMSUB_D  0x600007f
#define MATCH_FNMSUB_D 0x200004b
#define MASK_FNMSUB_D  0x600007f
#define MATCH_FNMADD_D 0x200004f
#define MASK_FNMADD_D  0x600007f
#define MATCH_FMADD_Q 0x6000043
#define MASK_FMADD_Q  0x600007f
#define MATCH_FMSUB_Q 0x6000047
#define MASK_FMSUB_Q  0x600007f
#define MATCH_FNMSUB_Q 0x600004b
#define MASK_FNMSUB_Q  0x600007f
#define MATCH_FNMADD_Q 0x600004f
#define MASK_FNMADD_Q  0x600007f
#define MATCH_C_NOP 0x1
#define MASK_C_NOP  0xffff
#define MATCH_C_ADDI16SP 0x6101
#define MASK_C_ADDI16SP  0xef83
#define MATCH_C_JR 0x8002
#define MASK_C_JR  0xf07f
#define MATCH_C_JALR 0x9002
#define MASK_C_JALR  0xf07f
#define MATCH_C_EBREAK 0x9002
#define MASK_C_EBREAK  0xffff
#define MATCH_C_LD 0x6000
#define MASK_C_LD  0xe003
#define MATCH_C_SD 0xe000
#define MASK_C_SD  0xe003
#define MATCH_C_ADDIW 0x2001
#define MASK_C_ADDIW  0xe003
#define MATCH_C_LDSP 0x6002
#define MASK_C_LDSP  0xe003
#define MATCH_C_SDSP 0xe002
#define MASK_C_SDSP  0xe003
#define MATCH_C_ADDI4SPN 0x0
#define MASK_C_ADDI4SPN  0xe003
#define MATCH_C_FLD 0x2000
#define MASK_C_FLD  0xe003
#define MATCH_C_LW 0x4000
#define MASK_C_LW  0xe003
#define MATCH_C_FLW 0x6000
#define MASK_C_FLW  0xe003
#define MATCH_C_FSD 0xa000
#define MASK_C_FSD  0xe003
#define MATCH_C_SW 0xc000
#define MASK_C_SW  0xe003
#define MATCH_C_FSW 0xe000
#define MASK_C_FSW  0xe003
#define MATCH_C_ADDI 0x1
#define MASK_C_ADDI  0xe003
#define MATCH_C_JAL 0x2001
#define MASK_C_JAL  0xe003
#define MATCH_C_LI 0x4001
#define MASK_C_LI  0xe003
#define MATCH_C_LUI 0x6001
#define MASK_C_LUI  0xe003
#define MATCH_C_SRLI 0x8001
#define MASK_C_SRLI  0xec03
#define MATCH_C_SRAI 0x8401
#define MASK_C_SRAI  0xec03
#define MATCH_C_ANDI 0x8801
#define MASK_C_ANDI  0xec03
#define MATCH_C_SUB 0x8c01
#define MASK_C_SUB  0xfc63
#define MATCH_C_XOR 0x8c21
#define MASK_C_XOR  0xfc63
#define MATCH_C_OR 0x8c41
#define MASK_C_OR  0xfc63
#define MATCH_C_AND 0x8c61
#define MASK_C_AND  0xfc63
#define MATCH_C_SUBW 0x9c01
#define MASK_C_SUBW  0xfc63
#define MATCH_C_ADDW 0x9c21
#define MASK_C_ADDW  0xfc63
#define MATCH_C_J 0xa001
#define MASK_C_J  0xe003
#define MATCH_C_BEQZ 0xc001
#define MASK_C_BEQZ  0xe003
#define MATCH_C_BNEZ 0xe001
#define MASK_C_BNEZ  0xe003
#define MATCH_C_SLLI 0x2
#define MASK_C_SLLI  0xe003
#define MATCH_C_FLDSP 0x2002
#define MASK_C_FLDSP  0xe003
#define MATCH_C_LWSP 0x4002
#define MASK_C_LWSP  0xe003
#define MATCH_C_FLWSP 0x6002
#define MASK_C_FLWSP  0xe003
#define MATCH_C_MV 0x8002
#define MASK_C_MV  0xf003
#define MATCH_C_ADD 0x9002
#define MASK_C_ADD  0xf003
#define MATCH_C_FSDSP 0xa002
#define MASK_C_FSDSP  0xe003
#define MATCH_C_SWSP 0xc002
#define MASK_C_SWSP  0xe003
#define MATCH_C_FSWSP 0xe002
#define MASK_C_FSWSP  0xe003
#define MATCH_CUSTOM0 0xb
#define MASK_CUSTOM0  0x707f
#define MATCH_CUSTOM0_RS1 0x200b
#define MASK_CUSTOM0_RS1  0x707f
#define MATCH_CUSTOM0_RS1_RS2 0x300b
#define MASK_CUSTOM0_RS1_RS2  0x707f
#define MATCH_CUSTOM0_RD 0x400b
#define MASK_CUSTOM0_RD  0x707f
#define MATCH_CUSTOM0_RD_RS1 0x600b
#define MASK_CUSTOM0_RD_RS1  0x707f
#define MATCH_CUSTOM0_RD_RS1_RS2 0x700b
#define MASK_CUSTOM0_RD_RS1_RS2  0x707f
#define MATCH_CUSTOM0_OTHERS 0x0b
#define MASK_CUSTOM0_OTHERS 0x7f

#define MATCH_CUSTOM1 0x2b
#define MASK_CUSTOM1  0x707f
#define MATCH_CUSTOM1_RS1 0x202b
#define MASK_CUSTOM1_RS1  0x707f
#define MATCH_CUSTOM1_RS1_RS2 0x302b
#define MASK_CUSTOM1_RS1_RS2  0x707f
#define MATCH_CUSTOM1_RD 0x402b
#define MASK_CUSTOM1_RD  0x707f
#define MATCH_CUSTOM1_RD_RS1 0x602b
#define MASK_CUSTOM1_RD_RS1  0x707f
#define MATCH_CUSTOM1_RD_RS1_RS2 0x702b
#define MASK_CUSTOM1_RD_RS1_RS2  0x707f
#define MATCH_CUSTOM1_OTHERS 0x2b
#define MASK_CUSTOM1_OTHERS 0x7f

#define MATCH_CUSTOM2 0x5b
#define MASK_CUSTOM2  0x707f
#define MATCH_CUSTOM2_RS1 0x205b
#define MASK_CUSTOM2_RS1  0x707f
#define MATCH_CUSTOM2_RS1_RS2 0x305b
#define MASK_CUSTOM2_RS1_RS2  0x707f
#define MATCH_CUSTOM2_RD 0x405b
#define MASK_CUSTOM2_RD  0x707f
#define MATCH_CUSTOM2_RD_RS1 0x605b
#define MASK_CUSTOM2_RD_RS1  0x707f
#define MATCH_CUSTOM2_RD_RS1_RS2 0x705b
#define MASK_CUSTOM2_RD_RS1_RS2  0x707f
#define MATCH_CUSTOM2_OTHERS 0x5b
#define MASK_CUSTOM2_OTHERS 0x7f

#define MATCH_CUSTOM3 0x7b
#define MASK_CUSTOM3  0x707f
#define MATCH_CUSTOM3_RS1 0x207b
#define MASK_CUSTOM3_RS1  0x707f
#define MATCH_CUSTOM3_RS1_RS2 0x307b
#define MASK_CUSTOM3_RS1_RS2  0x707f
#define MATCH_CUSTOM3_RD 0x407b
#define MASK_CUSTOM3_RD  0x707f
#define MATCH_CUSTOM3_RD_RS1 0x607b
#define MASK_CUSTOM3_RD_RS1  0x707f
#define MATCH_CUSTOM3_RD_RS1_RS2 0x707b
#define MASK_CUSTOM3_RD_RS1_RS2  0x707f
#define MATCH_CUSTOM3_OTHERS 0x7b
#define MASK_CUSTOM3_OTHERS 0x7f

#define CSR_FFLAGS 0x1
#define CSR_FRM 0x2
#define CSR_FCSR 0x3
#define CSR_CYCLE 0xc00
#define CSR_TIME 0xc01
#define CSR_INSTRET 0xc02
#define CSR_HPMCOUNTER3 0xc03
#define CSR_HPMCOUNTER4 0xc04
#define CSR_HPMCOUNTER5 0xc05
#define CSR_HPMCOUNTER6 0xc06
#define CSR_HPMCOUNTER7 0xc07
#define CSR_HPMCOUNTER8 0xc08
#define CSR_HPMCOUNTER9 0xc09
#define CSR_HPMCOUNTER10 0xc0a
#define CSR_HPMCOUNTER11 0xc0b
#define CSR_HPMCOUNTER12 0xc0c
#define CSR_HPMCOUNTER13 0xc0d
#define CSR_HPMCOUNTER14 0xc0e
#define CSR_HPMCOUNTER15 0xc0f
#define CSR_HPMCOUNTER16 0xc10
#define CSR_HPMCOUNTER17 0xc11
#define CSR_HPMCOUNTER18 0xc12
#define CSR_HPMCOUNTER19 0xc13
#define CSR_HPMCOUNTER20 0xc14
#define CSR_HPMCOUNTER21 0xc15
#define CSR_HPMCOUNTER22 0xc16
#define CSR_HPMCOUNTER23 0xc17
#define CSR_HPMCOUNTER24 0xc18
#define CSR_HPMCOUNTER25 0xc19
#define CSR_HPMCOUNTER26 0xc1a
#define CSR_HPMCOUNTER27 0xc1b
#define CSR_HPMCOUNTER28 0xc1c
#define CSR_HPMCOUNTER29 0xc1d
#define CSR_HPMCOUNTER30 0xc1e
#define CSR_HPMCOUNTER31 0xc1f
#define CSR_SSTATUS 0x100
#define CSR_SIE 0x104
#define CSR_STVEC 0x105
#define CSR_SCOUNTEREN 0x106
#define CSR_SSCRATCH 0x140
#define CSR_SEPC 0x141
#define CSR_SCAUSE 0x142
#define CSR_SBADADDR 0x143
#define CSR_SIP 0x144
#define CSR_SPTBR 0x180
//S mode user-defined csr
#define CSR_STVT 0x107
#define CSR_SNXTI 0x145
#define CSR_SINTSTATUS 0x146
#define CSR_SSCRATCHCSW 0x148
#define CSR_SSCRATCHCSWL 0x149
#define CSR_JALSNXTI 0x947
#define CSR_STVT2 0x948
#define CSR_PUSHSCAUSE 0x949
#define CSR_PUSHSEPC 0x94a
//
#define CSR_MSTATUS 0x300
#define CSR_MISA 0x301
#define CSR_MEDELEG 0x302
#define CSR_MIDELEG 0x303
#define CSR_MIE 0x304
#define CSR_MTVEC 0x305
#define CSR_MCOUNTEREN 0x306
#define CSR_MSCRATCH 0x340
#define CSR_MEPC 0x341
#define CSR_MCAUSE 0x342
#define CSR_MTVAL  0x343
#define CSR_MBADADDR 0x343
#define CSR_MIP 0x344
#define CSR_PMPCFG0 0x3a0
#define CSR_PMPCFG1 0x3a1
#define CSR_PMPCFG2 0x3a2
#define CSR_PMPCFG3 0x3a3
#define CSR_PMPADDR0 0x3b0
#define CSR_PMPADDR1 0x3b1
#define CSR_PMPADDR2 0x3b2
#define CSR_PMPADDR3 0x3b3
#define CSR_PMPADDR4 0x3b4
#define CSR_PMPADDR5 0x3b5
#define CSR_PMPADDR6 0x3b6
#define CSR_PMPADDR7 0x3b7
#define CSR_PMPADDR8 0x3b8
#define CSR_PMPADDR9 0x3b9
#define CSR_PMPADDR10 0x3ba
#define CSR_PMPADDR11 0x3bb
#define CSR_PMPADDR12 0x3bc
#define CSR_PMPADDR13 0x3bd
#define CSR_PMPADDR14 0x3be
#define CSR_PMPADDR15 0x3bf
#define CSR_SPMPCFG0  0x1a0
#define CSR_SPMPCFG1  0x1a1
#define CSR_SPMPCFG2  0x1a2
#define CSR_SPMPCFG3  0x1a3
#define CSR_SPMPADDR0 0x1b0
#define CSR_SPMPADDR1 0x1b1
#define CSR_SPMPADDR2 0x1b2
#define CSR_SPMPADDR3 0x1b3
#define CSR_SPMPADDR4 0x1b4
#define CSR_SPMPADDR5 0x1b5
#define CSR_SPMPADDR6 0x1b6
#define CSR_SPMPADDR7 0x1b7
#define CSR_SPMPADDR8 0x1b8
#define CSR_SPMPADDR9 0x1b9
#define CSR_SPMPADDR10 0x1ba
#define CSR_SPMPADDR11 0x1bb
#define CSR_SPMPADDR12 0x1bc
#define CSR_SPMPADDR13 0x1bd
#define CSR_SPMPADDR14 0x1be
#define CSR_SPMPADDR15 0x1bf
#define CSR_TSELECT 0x7a0
#define CSR_TDATA1 0x7a1
#define CSR_TDATA2 0x7a2
#define CSR_TDATA3 0x7a3
#define CSR_DCSR 0x7b0
#define CSR_DPC 0x7b1
#define CSR_DSCRATCH0 0x7b2
#define CSR_DSCRATCH1 0x7b3
#define CSR_MCYCLE 0xb00
#define CSR_MINSTRET 0xb02
#define CSR_MHPMCOUNTER3 0xb03
#define CSR_MHPMCOUNTER4 0xb04
#define CSR_MHPMCOUNTER5 0xb05
#define CSR_MHPMCOUNTER6 0xb06
#define CSR_MHPMCOUNTER7 0xb07
#define CSR_MHPMCOUNTER8 0xb08
#define CSR_MHPMCOUNTER9 0xb09
#define CSR_MHPMCOUNTER10 0xb0a
#define CSR_MHPMCOUNTER11 0xb0b
#define CSR_MHPMCOUNTER12 0xb0c
#define CSR_MHPMCOUNTER13 0xb0d
#define CSR_MHPMCOUNTER14 0xb0e
#define CSR_MHPMCOUNTER15 0xb0f
#define CSR_MHPMCOUNTER16 0xb10
#define CSR_MHPMCOUNTER17 0xb11
#define CSR_MHPMCOUNTER18 0xb12
#define CSR_MHPMCOUNTER19 0xb13
#define CSR_MHPMCOUNTER20 0xb14
#define CSR_MHPMCOUNTER21 0xb15
#define CSR_MHPMCOUNTER22 0xb16
#define CSR_MHPMCOUNTER23 0xb17
#define CSR_MHPMCOUNTER24 0xb18
#define CSR_MHPMCOUNTER25 0xb19
#define CSR_MHPMCOUNTER26 0xb1a
#define CSR_MHPMCOUNTER27 0xb1b
#define CSR_MHPMCOUNTER28 0xb1c
#define CSR_MHPMCOUNTER29 0xb1d
#define CSR_MHPMCOUNTER30 0xb1e
#define CSR_MHPMCOUNTER31 0xb1f
#define CSR_MHPMEVENT3 0x323
#define CSR_MHPMEVENT4 0x324
#define CSR_MHPMEVENT5 0x325
#define CSR_MHPMEVENT6 0x326
#define CSR_MHPMEVENT7 0x327
#define CSR_MHPMEVENT8 0x328
#define CSR_MHPMEVENT9 0x329
#define CSR_MHPMEVENT10 0x32a
#define CSR_MHPMEVENT11 0x32b
#define CSR_MHPMEVENT12 0x32c
#define CSR_MHPMEVENT13 0x32d
#define CSR_MHPMEVENT14 0x32e
#define CSR_MHPMEVENT15 0x32f
#define CSR_MHPMEVENT16 0x330
#define CSR_MHPMEVENT17 0x331
#define CSR_MHPMEVENT18 0x332
#define CSR_MHPMEVENT19 0x333
#define CSR_MHPMEVENT20 0x334
#define CSR_MHPMEVENT21 0x335
#define CSR_MHPMEVENT22 0x336
#define CSR_MHPMEVENT23 0x337
#define CSR_MHPMEVENT24 0x338
#define CSR_MHPMEVENT25 0x339
#define CSR_MHPMEVENT26 0x33a
#define CSR_MHPMEVENT27 0x33b
#define CSR_MHPMEVENT28 0x33c
#define CSR_MHPMEVENT29 0x33d
#define CSR_MHPMEVENT30 0x33e
#define CSR_MHPMEVENT31 0x33f
#define CSR_MVENDORID 0xf11
#define CSR_MARCHID 0xf12
#define CSR_MIMPID 0xf13
#define CSR_MHARTID 0xf14
#define CSR_CYCLEH 0xc80
#define CSR_TIMEH 0xc81
#define CSR_INSTRETH 0xc82
#define CSR_HPMCOUNTER3H 0xc83
#define CSR_HPMCOUNTER4H 0xc84
#define CSR_HPMCOUNTER5H 0xc85
#define CSR_HPMCOUNTER6H 0xc86
#define CSR_HPMCOUNTER7H 0xc87
#define CSR_HPMCOUNTER8H 0xc88
#define CSR_HPMCOUNTER9H 0xc89
#define CSR_HPMCOUNTER10H 0xc8a
#define CSR_HPMCOUNTER11H 0xc8b
#define CSR_HPMCOUNTER12H 0xc8c
#define CSR_HPMCOUNTER13H 0xc8d
#define CSR_HPMCOUNTER14H 0xc8e
#define CSR_HPMCOUNTER15H 0xc8f
#define CSR_HPMCOUNTER16H 0xc90
#define CSR_HPMCOUNTER17H 0xc91
#define CSR_HPMCOUNTER18H 0xc92
#define CSR_HPMCOUNTER19H 0xc93
#define CSR_HPMCOUNTER20H 0xc94
#define CSR_HPMCOUNTER21H 0xc95
#define CSR_HPMCOUNTER22H 0xc96
#define CSR_HPMCOUNTER23H 0xc97
#define CSR_HPMCOUNTER24H 0xc98
#define CSR_HPMCOUNTER25H 0xc99
#define CSR_HPMCOUNTER26H 0xc9a
#define CSR_HPMCOUNTER27H 0xc9b
#define CSR_HPMCOUNTER28H 0xc9c
#define CSR_HPMCOUNTER29H 0xc9d
#define CSR_HPMCOUNTER30H 0xc9e
#define CSR_HPMCOUNTER31H 0xc9f
#define CSR_MCYCLEH 0xb80
#define CSR_MINSTRETH 0xb82
#define CSR_MHPMCOUNTER3H 0xb83
#define CSR_MHPMCOUNTER4H 0xb84
#define CSR_MHPMCOUNTER5H 0xb85
#define CSR_MHPMCOUNTER6H 0xb86
#define CSR_MHPMCOUNTER7H 0xb87
#define CSR_MHPMCOUNTER8H 0xb88
#define CSR_MHPMCOUNTER9H 0xb89
#define CSR_MHPMCOUNTER10H 0xb8a
#define CSR_MHPMCOUNTER11H 0xb8b
#define CSR_MHPMCOUNTER12H 0xb8c
#define CSR_MHPMCOUNTER13H 0xb8d
#define CSR_MHPMCOUNTER14H 0xb8e
#define CSR_MHPMCOUNTER15H 0xb8f
#define CSR_MHPMCOUNTER16H 0xb90
#define CSR_MHPMCOUNTER17H 0xb91
#define CSR_MHPMCOUNTER18H 0xb92
#define CSR_MHPMCOUNTER19H 0xb93
#define CSR_MHPMCOUNTER20H 0xb94
#define CSR_MHPMCOUNTER21H 0xb95
#define CSR_MHPMCOUNTER22H 0xb96
#define CSR_MHPMCOUNTER23H 0xb97
#define CSR_MHPMCOUNTER24H 0xb98
#define CSR_MHPMCOUNTER25H 0xb99
#define CSR_MHPMCOUNTER26H 0xb9a
#define CSR_MHPMCOUNTER27H 0xb9b
#define CSR_MHPMCOUNTER28H 0xb9c
#define CSR_MHPMCOUNTER29H 0xb9d
#define CSR_MHPMCOUNTER30H 0xb9e
#define CSR_MHPMCOUNTER31H 0xb9f
#define CAUSE_MISALIGNED_FETCH 0x0
#define CAUSE_FETCH_ACCESS 0x1
#define CAUSE_ILLEGAL_INSTRUCTION 0x2
#define CAUSE_BREAKPOINT 0x3
#define CAUSE_MISALIGNED_LOAD 0x4
#define CAUSE_LOAD_ACCESS 0x5
#define CAUSE_MISALIGNED_STORE 0x6
#define CAUSE_STORE_ACCESS 0x7
#define CAUSE_USER_ECALL 0x8
#define CAUSE_SUPERVISOR_ECALL 0x9
#define CAUSE_HYPERVISOR_ECALL 0xa
#define CAUSE_MACHINE_ECALL 0xb
#define CAUSE_FETCH_PAGE_FAULT 0xc
#define CAUSE_LOAD_PAGE_FAULT 0xd
#define CAUSE_STORE_PAGE_FAULT 0xf

// ========================================================================= //
// ============================== n22 csr ================================== //
// ========================================================================= //
#define CSR_UITB                   0x800
#define CSR_MICM_CFG               0xFC0      
#define CSR_MDCM_CFG               0xFC1
#define CSR_MMSC_CFG               0xFC2
#define CSR_MILMB                  0x7C0
#define CSR_MDLMB                  0x7C1
#define CSR_MCACHE_CTL             0x7CA
#define CSR_MHSP_CTL               0x7C6
#define CSR_MSP_BOUND              0x7C7
#define CSR_MSP_BASE               0x7C8
#define CSR_MTVT                   0x307
#define CSR_MCOUTINHIBIT           0x320
#define CSR_MNXTI                  0x345
#define CSR_MINTSTATUS             0x346
#define CSR_MSCRATCHCSW            0x348
#define CSR_MSCRATCHCSWL           0x349
#define CSR_MNVEC                  0x7C3
#define CSR_MXSTATUS               0x7C4
#define CSR_MDCAUSE                0x7C9
#define CSR_MSAVESTATUS            0x7D6
#define CSR_MSAVEEPC1              0x7D7
#define CSR_MSAVECAUSE1            0x7D8
#define CSR_MSAVEEPC2              0x7D9
#define CSR_MSAVECAUSE2            0x7DA
#define CSR_MSAVEDCAUSE1           0x7DB
#define CSR_MSAVEDCAUSE2           0x7DC
#define CSR_MPFT_CTL               0x7C5
#define CSR_MMISC_CTL              0x7D0
#define CSR_MCOUNTERWEN            0x7CE
#define CSR_MCOUNTERINTEN          0x7CF
#define CSR_MCOUNTERMASK_M         0x7D1
#define CSR_MCOUNTERMASK_U         0x7D3
#define CSR_MCOUNTEROVF            0x7D4
#define CSR_PUSHMXSTATUS           0x7EB
#define CSR_MTVT2                  0x7EC
#define CSR_JALMNXTI               0x7ED
#define CSR_MPUSHMCAUSE            0x7EE
#define CSR_MPUSHMEPC              0x7EF
#define CSR_MPPIB                  0x7F0
#define CSR_MFIOB                  0x7F1
#define CSR_UCODE                  0x801
#define CSR_WFE                    0x810
#define CSR_SLEEPVALUE             0x811
#define CSR_TXEVT                  0x812

#define CSR_MCOUNTINHIBIT  0x320
#define CSR_MSUBM 0x7c4
#define CSR_PUSHMSUBM 0x7eb
#define CSR_PUSHMCAUSE 0x7ee
#define CSR_PUSHMEPC 0x7ef

// ===============================N extension ==========================//

#define CSR_USTATUS                0x000
#define CSR_UIE                    0x004
#define CSR_UTVEC                  0x005
#define CSR_UTVT                   0x007
#define CSR_USCRATCH               0x040
#define CSR_UEPC                   0x041
#define CSR_UCAUSE                 0x042
#define CSR_UTVAL                  0x043
#define CSR_UIP                    0x044
#define CSR_UNXTI                  0x045
#define CSR_UINTSTATUS             0x046
#define CSR_USCRATCHCSWL           0x049
#define CSR_JALUNXTI               0x847
#define CSR_UTVT2                  0x848
#define CSR_PUSHUCAUSE             0x849
#define CSR_PUSHUEPC               0x850
// =====================================================================//

//===============================Lockstep==============================//
#define CSR_LSTEPCTRL              0x7E8
#define CSR_LSTEPFORC              0x7E9

//===============================SCP==============================//
#define CSR_FAKE_GEN               0x7F3

#define MINTSTATUS_MIL             0xFF000000
#define MINTSTATUS_SIL             0x0000FF00
#define MINTSTATUS_UIL             0xFF0000FF

#define ILM_BASE_ADDR              0x80000000
#define DLM_BASE_ADDR              0x90000000

#define MSAVESTATUS_MPIE1          0x0001
#define MSAVESTATUS_MPIE2          0x0100
#define MSAVESTATUS_MPP1           0x0006
#define MSAVESTATUS_MPP2           0x0600
#define MSAVESTATUS_PTY1           0x00C0
#define MSAVESTATUS_PTY2           0xC000

// ============================== n22 insn ================================== //

#define MATCH_ADDIGP	             0x100B	     
#define MASK_ADDIGP	               0x307F
#define MATCH_BBC	                 0x705B	     
#define MASK_BBC	                 0x400070FF
#define MATCH_BBS	                 0x4000705B	 
#define MASK_BBS	                 0x400070FF
#define MATCH_BEQC	               0x505B	     
#define MASK_BEQC	                 0x707F
#define MATCH_BNEC	               0x605B	     
#define MASK_BNEC	                 0x707F
#define MATCH_BFOS	               0x305B	    
#define MASK_BFOS	                 0x8200707F
#define MATCH_BFOZ	               0x205B	     
#define MASK_BFOZ	                 0x8200707F
#define MATCH_LEA_H	               0x0A00005B	 
#define MASK_LEA_H	               0xFE00707F
#define MATCH_LEA_W	               0x0C00005B	 
#define MASK_LEA_W	               0xFE00707F
#define MATCH_LEA_D	               0x0E00005B	 
#define MASK_LEA_D	               0xFE00707F
#define MATCH_LBGP	               0x000B	     
#define MASK_LBGP	                 0x307F
#define MATCH_LBUGP	               0x200B	     
#define MASK_LBUGP	               0x307F
#define MATCH_LHGP	               0x102B	     
#define MASK_LHGP	                 0x707F
#define MATCH_LHUGP	               0x502B	     
#define MASK_LHUGP	               0x707F
#define MATCH_LWGP	               0x202B	     
#define MASK_LWGP	                 0x707F
#define MATCH_SBGP	               0x300B	     
#define MASK_SBGP	                 0x307F
#define MATCH_SHGP	               0x002B	     
#define MASK_SHGP	                 0x707F
#define MATCH_SWGP	               0x402B	     
#define MASK_SWGP	                 0x707F
#define MATCH_FFB	                 0x2000005B	 
#define MASK_FFB	                 0xFE00707F
#define MATCH_FFZMISM	             0x2200005B	 
#define MASK_FFZMISM	             0xFE00707F
#define MATCH_FFMISM	             0x2400005B	 
#define MASK_FFMISM	               0xFE00707F
#define MATCH_FLMISM	             0x2600005B	 
#define MASK_FLMISM	               0xFE00707F
#define MATCH_EXEC_IT	             0x8000	     
#define MASK_EXEC_IT	             0xE083
#define MATCH_FLHW                  0x7
#define MASK_FLHW                   0x707f
#define MATCH_FSHW                  0x27
#define MASK_FSHW                   0x707f

//------------------BEGIN dsp -----------------------//
#define MATCH_ADD16 0x4000007f
#define MASK_ADD16 0xfe00707f
#define MATCH_RADD16 0x7f
#define MASK_RADD16 0xfe00707f
#define MATCH_URADD16 0x2000007f
#define MASK_URADD16 0xfe00707f
#define MATCH_KADD16 0x1000007f
#define MASK_KADD16 0xfe00707f
#define MATCH_UKADD16 0x3000007f
#define MASK_UKADD16 0xfe00707f
#define MATCH_SUB16 0x4200007f
#define MASK_SUB16 0xfe00707f
#define MATCH_RSUB16 0x200007f
#define MASK_RSUB16 0xfe00707f
#define MATCH_URSUB16 0x2200007f
#define MASK_URSUB16 0xfe00707f
#define MATCH_KSUB16 0x1200007f
#define MASK_KSUB16 0xfe00707f
#define MATCH_UKSUB16 0x3200007f
#define MASK_UKSUB16 0xfe00707f
#define MATCH_CRAS16 0x4400007f
#define MASK_CRAS16 0xfe00707f
#define MATCH_RCRAS16 0x400007f
#define MASK_RCRAS16 0xfe00707f
#define MATCH_URCRAS16 0x2400007f
#define MASK_URCRAS16 0xfe00707f
#define MATCH_KCRAS16 0x1400007f
#define MASK_KCRAS16 0xfe00707f
#define MATCH_UKCRAS16 0x3400007f
#define MASK_UKCRAS16 0xfe00707f
#define MATCH_CRSA16 0x4600007f
#define MASK_CRSA16 0xfe00707f
#define MATCH_RCRSA16 0x600007f
#define MASK_RCRSA16 0xfe00707f
#define MATCH_URCRSA16 0x2600007f
#define MASK_URCRSA16 0xfe00707f
#define MATCH_KCRSA16 0x1600007f
#define MASK_KCRSA16 0xfe00707f
#define MATCH_UKCRSA16 0x3600007f
#define MASK_UKCRSA16 0xfe00707f
#define MATCH_STAS16 0x4400307f
#define MASK_STAS16 0xfe00707f
#define MATCH_RSTAS16 0x400307f
#define MASK_RSTAS16 0xfe00707f
#define MATCH_URSTAS16 0x2400307f
#define MASK_URSTAS16 0xfe00707f
#define MATCH_KSTAS16 0x1400307f
#define MASK_KSTAS16 0xfe00707f
#define MATCH_UKSTAS16 0x3400307f
#define MASK_UKSTAS16 0xfe00707f
#define MATCH_STSA16 0x4600307f
#define MASK_STSA16 0xfe00707f
#define MATCH_RSTSA16 0x600307f
#define MASK_RSTSA16 0xfe00707f
#define MATCH_URSTSA16 0x2600307f
#define MASK_URSTSA16 0xfe00707f
#define MATCH_KSTSA16 0x1600307f
#define MASK_KSTSA16 0xfe00707f
#define MATCH_UKSTSA16 0x3600307f
#define MASK_UKSTSA16 0xfe00707f
#define MATCH_ADD8 0x4800007f
#define MASK_ADD8 0xfe00707f
#define MATCH_RADD8 0x800007f
#define MASK_RADD8 0xfe00707f
#define MATCH_URADD8 0x2800007f
#define MASK_URADD8 0xfe00707f
#define MATCH_KADD8 0x1800007f
#define MASK_KADD8 0xfe00707f
#define MATCH_UKADD8 0x3800007f
#define MASK_UKADD8 0xfe00707f
#define MATCH_SUB8 0x4a00007f
#define MASK_SUB8 0xfe00707f
#define MATCH_RSUB8 0xa00007f
#define MASK_RSUB8 0xfe00707f
#define MATCH_URSUB8 0x2a00007f
#define MASK_URSUB8 0xfe00707f
#define MATCH_KSUB8 0x1a00007f
#define MASK_KSUB8 0xfe00707f
#define MATCH_UKSUB8 0x3a00007f
#define MASK_UKSUB8 0xfe00707f
#define MATCH_SRA16 0x5000007f
#define MASK_SRA16 0xfe00707f
#define MATCH_SRAI16 0x7000007f
#define MASK_SRAI16 0xff00707f
#define MATCH_SRA16_u 0x6000007f
#define MASK_SRA16_u 0xfe00707f
#define MATCH_SRAI16_u 0x7100007f
#define MASK_SRAI16_u 0xff00707f
#define MATCH_SRL16 0x5200007f
#define MASK_SRL16 0xfe00707f
#define MATCH_SRLI16 0x7200007f
#define MASK_SRLI16 0xff00707f
#define MATCH_SRL16_u 0x6200007f
#define MASK_SRL16_u 0xfe00707f
#define MATCH_SRLI16_u 0x7300007f
#define MASK_SRLI16_u 0xff00707f
#define MATCH_SLL16 0x5400007f
#define MASK_SLL16 0xfe00707f
#define MATCH_SLLI16 0x7400007f
#define MASK_SLLI16 0xff00707f
#define MATCH_KSLL16 0x6400007f
#define MASK_KSLL16 0xfe00707f
#define MATCH_KSLLI16 0x7500007f
#define MASK_KSLLI16 0xff00707f
#define MATCH_KSLRA16 0x5600007f
#define MASK_KSLRA16 0xfe00707f
#define MATCH_KSLRA16_u 0x6600007f
#define MASK_KSLRA16_u 0xfe00707f
#define MATCH_SRA8 0x5800007f
#define MASK_SRA8 0xfe00707f
#define MATCH_SRAI8 0x7800007f
#define MASK_SRAI8 0xff80707f
#define MATCH_SRA8_u 0x6800007f
#define MASK_SRA8_u 0xfe00707f
#define MATCH_SRAI8_u 0x7880007f
#define MASK_SRAI8_u 0xff80707f
#define MATCH_SRL8 0x5a00007f
#define MASK_SRL8 0xfe00707f
#define MATCH_SRLI8 0x7a00007f
#define MASK_SRLI8 0xff80707f
#define MATCH_SRL8_u 0x6a00007f
#define MASK_SRL8_u 0xfe00707f
#define MATCH_SRLI8_u 0x7a80007f
#define MASK_SRLI8_u 0xff80707f
#define MATCH_SLL8 0x5c00007f
#define MASK_SLL8 0xfe00707f
#define MATCH_SLLI8 0x7c00007f
#define MASK_SLLI8 0xff80707f
#define MATCH_KSLL8 0x6c00007f
#define MASK_KSLL8 0xfe00707f
#define MATCH_KSLLI8 0x7c80007f
#define MASK_KSLLI8 0xff80707f
#define MATCH_KSLRA8 0x5e00007f
#define MASK_KSLRA8 0xfe00707f
#define MATCH_KSLRA8_u 0x6e00007f
#define MASK_KSLRA8_u 0xfe00707f
#define MATCH_CMPEQ16 0x4c00007f
#define MASK_CMPEQ16 0xfe00707f
#define MATCH_SCMPLT16 0xc00007f
#define MASK_SCMPLT16 0xfe00707f
#define MATCH_SCMPLE16 0x1c00007f
#define MASK_SCMPLE16 0xfe00707f
#define MATCH_UCMPLT16 0x2c00007f
#define MASK_UCMPLT16 0xfe00707f
#define MATCH_UCMPLE16 0x3c00007f
#define MASK_UCMPLE16 0xfe00707f
#define MATCH_CMPEQ8 0x4e00007f
#define MASK_CMPEQ8 0xfe00707f
#define MATCH_SCMPLT8 0xe00007f
#define MASK_SCMPLT8 0xfe00707f
#define MATCH_SCMPLE8 0x1e00007f
#define MASK_SCMPLE8 0xfe00707f
#define MATCH_UCMPLT8 0x2e00007f
#define MASK_UCMPLT8 0xfe00707f
#define MATCH_UCMPLE8 0x3e00007f
#define MASK_UCMPLE8 0xfe00707f
#define MATCH_SMUL16 0xa000007f
#define MASK_SMUL16 0xfe00707f
#define MATCH_SMULX16 0xa200007f
#define MASK_SMULX16 0xfe00707f
#define MATCH_KHM16 0x8600007f
#define MASK_KHM16 0xfe00707f
#define MATCH_KHMX16 0x9600007f
#define MASK_KHMX16 0xfe00707f
#define MATCH_SMUL8 0xa800007f
#define MASK_SMUL8 0xfe00707f
#define MATCH_SMULX8 0xaa00007f
#define MASK_SMULX8 0xfe00707f
#define MATCH_KHM8 0x8e00007f
#define MASK_KHM8 0xfe00707f
#define MATCH_KHMX8 0x9e00007f
#define MASK_KHMX8 0xfe00707f
#define MATCH_SMIN16 0x8000007f
#define MASK_SMIN16 0xfe00707f
#define MATCH_UMIN16 0x9000007f
#define MASK_UMIN16 0xfe00707f
#define MATCH_SMAX16 0x8200007f
#define MASK_SMAX16 0xfe00707f
#define MATCH_UMAX16 0x9200007f
#define MASK_UMAX16 0xfe00707f
#define MATCH_SCLIP16 0x8400007f
#define MASK_SCLIP16 0xff00707f
#define MATCH_UCLIP16 0x8500007f
#define MASK_UCLIP16 0xff00707f
#define MATCH_KABS16 0xad10007f
#define MASK_KABS16 0xfff0707f
#define MATCH_CLRS16 0xae80007f
#define MASK_CLRS16 0xfff0707f
#define MATCH_CLZ16 0xae90007f
#define MASK_CLZ16 0xfff0707f
#define MATCH_CLO16 0xaeb0007f
#define MASK_CLO16 0xfff0707f
#define MATCH_SMIN8 0x8800007f
#define MASK_SMIN8 0xfe00707f
#define MATCH_UMIN8 0x9800007f
#define MASK_UMIN8 0xfe00707f
#define MATCH_SMAX8 0x8a00007f
#define MASK_SMAX8 0xfe00707f
#define MATCH_UMAX8 0x9a00007f
#define MASK_UMAX8 0xfe00707f
#define MATCH_SCLIP8 0x8c00007f
#define MASK_SCLIP8 0xff80707f
#define MATCH_UCLIP8 0x8d00007f
#define MASK_UCLIP8 0xff80707f
#define MATCH_KABS8 0xad00007f
#define MASK_KABS8 0xfff0707f
#define MATCH_CLRS8 0xae00007f
#define MASK_CLRS8 0xfff0707f
#define MATCH_CLZ8 0xae10007f
#define MASK_CLZ8 0xfff0707f
#define MATCH_CLO8 0xae30007f
#define MASK_CLO8 0xfff0707f
#define MATCH_SUNPKD810 0xac80007f
#define MASK_SUNPKD810 0xfff0707f
#define MATCH_SUNPKD820 0xac90007f
#define MASK_SUNPKD820 0xfff0707f
#define MATCH_SUNPKD830 0xaca0007f
#define MASK_SUNPKD830 0xfff0707f
#define MATCH_SUNPKD831 0xacb0007f
#define MASK_SUNPKD831 0xfff0707f
#define MATCH_SUNPKD832 0xad30007f
#define MASK_SUNPKD832 0xfff0707f
#define MATCH_ZUNPKD810 0xacc0007f
#define MASK_ZUNPKD810 0xfff0707f
#define MATCH_ZUNPKD820 0xacd0007f
#define MASK_ZUNPKD820 0xfff0707f
#define MATCH_ZUNPKD830 0xace0007f
#define MASK_ZUNPKD830 0xfff0707f
#define MATCH_ZUNPKD831 0xacf0007f
#define MASK_ZUNPKD831 0xfff0707f
#define MATCH_ZUNPKD832 0xad70007f
#define MASK_ZUNPKD832 0xfff0707f
#define MATCH_PKBB16 0xe00107f
#define MASK_PKBB16 0xfe00707f
#define MATCH_PKBT16 0x1e00107f
#define MASK_PKBT16 0xfe00707f
#define MATCH_PKTB16 0x3e00107f
#define MASK_PKTB16 0xfe00707f
#define MATCH_PKTT16 0x2e00107f
#define MASK_PKTT16 0xfe00707f
#define MATCH_SMMUL 0x4000107f
#define MASK_SMMUL 0xfe00707f
#define MATCH_SMMUL_u 0x5000107f
#define MASK_SMMUL_u 0xfe00707f
#define MATCH_KMMAC 0x6000107f
#define MASK_KMMAC 0xfe00707f
#define MATCH_KMMAC_u 0x7000107f
#define MASK_KMMAC_u 0xfe00707f
#define MATCH_KMMSB 0x4200107f
#define MASK_KMMSB 0xfe00707f
#define MATCH_KMMSB_u 0x5200107f
#define MASK_KMMSB_u 0xfe00707f
#define MATCH_KWMMUL 0x6200107f
#define MASK_KWMMUL 0xfe00707f
#define MATCH_KWMMUL_u 0x7200107f
#define MASK_KWMMUL_u 0xfe00707f
#define MATCH_SMMWB 0x4400107f
#define MASK_SMMWB 0xfe00707f
#define MATCH_SMMWB_u 0x5400107f
#define MASK_SMMWB_u 0xfe00707f
#define MATCH_SMMWT 0x6400107f
#define MASK_SMMWT 0xfe00707f
#define MATCH_SMMWT_u 0x7400107f
#define MASK_SMMWT_u 0xfe00707f
#define MATCH_KMMAWB 0x4600107f
#define MASK_KMMAWB 0xfe00707f
#define MATCH_KMMAWB_u 0x5600107f
#define MASK_KMMAWB_u 0xfe00707f
#define MATCH_KMMAWT 0x6600107f
#define MASK_KMMAWT 0xfe00707f
#define MATCH_KMMAWT_u 0x7600107f
#define MASK_KMMAWT_u 0xfe00707f
#define MATCH_KMMWB2 0x8e00107f
#define MASK_KMMWB2 0xfe00707f
#define MATCH_KMMWB2_u 0x9e00107f
#define MASK_KMMWB2_u 0xfe00707f
#define MATCH_KMMWT2 0xae00107f
#define MASK_KMMWT2 0xfe00707f
#define MATCH_KMMWT2_u 0xbe00107f
#define MASK_KMMWT2_u 0xfe00707f
#define MATCH_KMMAWB2 0xce00107f
#define MASK_KMMAWB2 0xfe00707f
#define MATCH_KMMAWB2_u 0xde00107f
#define MASK_KMMAWB2_u 0xfe00707f
#define MATCH_KMMAWT2 0xee00107f
#define MASK_KMMAWT2 0xfe00707f
#define MATCH_KMMAWT2_u 0xfe00107f
#define MASK_KMMAWT2_u 0xfe00707f
#define MATCH_SMSLDA 0xac00107f
#define MASK_SMSLDA 0xfe00707f
#define MATCH_SMSLXDA 0xbc00107f
#define MASK_SMSLXDA 0xfe00707f
#define MATCH_SMBB16 0x800107f
#define MASK_SMBB16 0xfe00707f
#define MATCH_SMBT16 0x1800107f
#define MASK_SMBT16 0xfe00707f
#define MATCH_SMTT16 0x2800107f
#define MASK_SMTT16 0xfe00707f
#define MATCH_KMDA 0x3800107f
#define MASK_KMDA 0xfe00707f
#define MATCH_KMXDA 0x3a00107f
#define MASK_KMXDA 0xfe00707f
#define MATCH_SMDS 0x5800107f
#define MASK_SMDS 0xfe00707f
#define MATCH_SMDRS 0x6800107f
#define MASK_SMDRS 0xfe00707f
#define MATCH_SMXDS 0x7800107f
#define MASK_SMXDS 0xfe00707f
#define MATCH_KMABB 0x5a00107f
#define MASK_KMABB 0xfe00707f
#define MATCH_KMABT 0x6a00107f
#define MASK_KMABT 0xfe00707f
#define MATCH_KMATT 0x7a00107f
#define MASK_KMATT 0xfe00707f
#define MATCH_KMADA 0x4800107f
#define MASK_KMADA 0xfe00707f
#define MATCH_KMAXDA 0x4a00107f
#define MASK_KMAXDA 0xfe00707f
#define MATCH_KMADS 0x5c00107f
#define MASK_KMADS 0xfe00707f
#define MATCH_KMADRS 0x6c00107f
#define MASK_KMADRS 0xfe00707f
#define MATCH_KMAXDS 0x7c00107f
#define MASK_KMAXDS 0xfe00707f
#define MATCH_KMSDA 0x4c00107f
#define MASK_KMSDA 0xfe00707f
#define MATCH_KMSXDA 0x4e00107f
#define MASK_KMSXDA 0xfe00707f
#define MATCH_SCLIP32 0xe400007f
#define MASK_SCLIP32 0xfe00707f
#define MATCH_UCLIP32 0xf400007f
#define MASK_UCLIP32 0xfe00707f
#define MATCH_CLRS32 0xaf80007f
#define MASK_CLRS32 0xfff0707f
#define MATCH_CLZ32 0xaf90007f
#define MASK_CLZ32 0xfff0707f
#define MATCH_CLO32 0xafb0007f
#define MASK_CLO32 0xfff0707f
#define MATCH_PBSAD 0xfc00007f
#define MASK_PBSAD 0xfe00707f
#define MATCH_PBSADA 0xfe00007f
#define MASK_PBSADA 0xfe00707f
#define MATCH_SMAQA 0xc800007f
#define MASK_SMAQA 0xfe00707f
#define MATCH_UMAQA 0xcc00007f
#define MASK_UMAQA 0xfe00707f
#define MATCH_SMAQA_su 0xca00007f
#define MASK_SMAQA_su 0xfe00707f
#define MATCH_KADDH 0x400107f
#define MASK_KADDH 0xfe00707f
#define MATCH_KSUBH 0x600107f
#define MASK_KSUBH 0xfe00707f
#define MATCH_KHMBB 0xc00107f
#define MASK_KHMBB 0xfe00707f
#define MATCH_KHMBT 0x1c00107f
#define MASK_KHMBT 0xfe00707f
#define MATCH_KHMTT 0x2c00107f
#define MASK_KHMTT 0xfe00707f
#define MATCH_UKADDH 0x1400107f
#define MASK_UKADDH 0xfe00707f
#define MATCH_UKSUBH 0x1600107f
#define MASK_UKSUBH 0xfe00707f
#define MATCH_KADDW 0x107f
#define MASK_KADDW 0xfe00707f
#define MATCH_UKADDW 0x1000107f
#define MASK_UKADDW 0xfe00707f
#define MATCH_KSUBW 0x200107f
#define MASK_KSUBW 0xfe00707f
#define MATCH_UKSUBW 0x1200107f
#define MASK_UKSUBW 0xfe00707f
#define MATCH_KDMBB 0xa00107f
#define MASK_KDMBB 0xfe00707f
#define MATCH_KDMBT 0x1a00107f
#define MASK_KDMBT 0xfe00707f
#define MATCH_KDMTT 0x2a00107f
#define MASK_KDMTT 0xfe00707f
#define MATCH_KSLRAW 0x6e00107f
#define MASK_KSLRAW 0xfe00707f
#define MATCH_KSLRAW_u 0x7e00107f
#define MASK_KSLRAW_u 0xfe00707f
#define MATCH_KSLLW 0x2600107f
#define MASK_KSLLW 0xfe00707f
#define MATCH_KSLLIW 0x3600107f
#define MASK_KSLLIW 0xfe00707f
#define MATCH_KDMABB 0xd200107f
#define MASK_KDMABB 0xfe00707f
#define MATCH_KDMABT 0xe200107f
#define MASK_KDMABT 0xfe00707f
#define MATCH_KDMATT 0xf200107f
#define MASK_KDMATT 0xfe00707f
#define MATCH_KABSW 0xad40007f
#define MASK_KABSW 0xfff0707f
#define MATCH_RADDW 0x2000107f
#define MASK_RADDW 0xfe00707f
#define MATCH_URADDW 0x3000107f
#define MASK_URADDW 0xfe00707f
#define MATCH_RSUBW 0x2200107f
#define MASK_RSUBW 0xfe00707f
#define MATCH_URSUBW 0x3200107f
#define MASK_URSUBW 0xfe00707f
#define MATCH_RDOV 0x80102073
#define MASK_RDOV 0xfffff07f
#define MATCH_AVE 0xe000007f
#define MASK_AVE 0xfe00707f
#define MATCH_SRA_u 0x2400107f
#define MASK_SRA_u 0xfe00707f
#define MATCH_SRAI_u 0xd400107f
#define MASK_SRAI_u 0xfc00707f
#define MATCH_BITREV 0xe600007f
#define MASK_BITREV 0xfe00707f
#define MATCH_BITREVI 0xe800007f
#define MASK_BITREVI 0xfc00707f
#define MATCH_WEXT 0xce00007f
#define MASK_WEXT 0xfe00707f
#define MATCH_WEXTI 0xde00007f
#define MASK_WEXTI 0xfe00707f
#define MATCH_BPICK 0xc000207f
#define MASK_BPICK 0xc000707f
#define MATCH_MADDR32 0xc400107f
#define MASK_MADDR32 0xfe00707f
#define MATCH_MTLEI 0xfa00007f
#define MASK_MTLEI 0xfe00707f
#define MATCH_MAXW 0xf200007f
#define MASK_MAXW 0xfe00707f
#define MATCH_MINW 0xf000007f
#define MASK_MINW 0xfe00707f
#define MATCH_MSUBR32 0xc600107f
#define MASK_MSUBR32 0xfe00707f
#define MATCH_MULR64 0xf000107f
#define MASK_MULR64 0xfe00707f
#define MATCH_MULSR64 0xe000107f
#define MASK_MULSR64 0xfe00707f
#define MATCH_MTLBI 0xf800007f
#define MASK_MTLBI 0xfe00707f
#define MATCH_INSB 0xac00007f
#define MASK_INSB 0xff80707f
#define MATCH_SMAL 0x5e00107f
#define MASK_SMAL 0xfe00707f
#define MATCH_SMALBB 0x8800107f
#define MASK_SMALBB 0xfe00707f
#define MATCH_SMALBT 0x9800107f
#define MASK_SMALBT 0xfe00707f
#define MATCH_SMALTT 0xa800107f
#define MASK_SMALTT 0xfe00707f
#define MATCH_SMALDA 0x8c00107f
#define MASK_SMALDA 0xfe00707f
#define MATCH_SMALXDA 0x9c00107f
#define MASK_SMALXDA 0xfe00707f
#define MATCH_SMALDS 0x8a00107f
#define MASK_SMALDS 0xfe00707f
#define MATCH_SMALDRS 0x9a00107f
#define MASK_SMALDRS 0xfe00707f
#define MATCH_SMALXDS 0xaa00107f
#define MASK_SMALXDS 0xfe00707f
#define MATCH_SMAR64 0x8400107f
#define MASK_SMAR64 0xfe00707f
#define MATCH_SMSR64 0x8600107f
#define MASK_SMSR64 0xfe00707f
#define MATCH_SUB64 0xc200107f
#define MASK_SUB64 0xfe00707f
#define MATCH_UKADD64 0xb000107f
#define MASK_UKADD64 0xfe00707f
#define MATCH_UKMSR64 0xb600107f
#define MASK_UKMSR64 0xfe00707f
#define MATCH_UKMAR64 0xb400107f
#define MASK_UKMAR64 0xfe00707f
#define MATCH_UKSUB64 0xb200107f
#define MASK_UKSUB64 0xfe00707f
#define MATCH_UMAR64 0xa400107f
#define MASK_UMAR64 0xfe00707f
#define MATCH_UMSR64 0xa600107f
#define MASK_UMSR64 0xfe00707f
#define MATCH_URADD64 0xa000107f
#define MASK_URADD64 0xfe00707f
#define MATCH_URSUB64 0xa200107f
#define MASK_URSUB64 0xfe00707f
#define MATCH_SWAP8 0xad80007f
#define MASK_SWAP8 0xfff0707f
#define MATCH_SWAP16 0xad90007f
#define MASK_SWAP16 0xfff0707f
#define MATCH_UMUL8 0xb800007f
#define MASK_UMUL8 0xfe00707f
#define MATCH_UMULX8 0xba00007f
#define MASK_UMULX8 0xfe00707f
#define MATCH_UMUL16 0xb000007f
#define MASK_UMUL16 0xfe00707f
#define MATCH_UMULX16 0xb200007f
#define MASK_UMULX16 0xfe00707f
#define MATCH_ADD64 0xc000107f
#define MASK_ADD64 0xfe00707f
#define MATCH_RADD64 0x8000107f
#define MASK_RADD64 0xfe00707f
#define MATCH_KADD64 0x9000107f
#define MASK_KADD64 0xfe00707f
#define MATCH_RSUB64 0x8200107f
#define MASK_RSUB64 0xfe00707f
#define MATCH_KSUB64 0x9200107f
#define MASK_KSUB64 0xfe00707f
#define MATCH_KMAR64 0x9400107f
#define MASK_KMAR64 0xfe00707f
#define MATCH_KMSR64 0x9600107f
#define MASK_KMSR64 0xfe00707f
#define MATCH_DKHM8 0x8e00707f
#define MASK_DKHM8 0xfe00707f  
#define MATCH_DKHM16 0x8600707f
#define MASK_DKHM16 0xfe00707f
#define MATCH_DKABS8 0xad00707f
#define MASK_DKABS8 0xfff0707f
#define MATCH_DKABS16 0xad10707f
#define MASK_DKABS16 0xfff0707f
#define MATCH_DKADD8 0x1800707f
#define MASK_DKADD8 0xfe00707f
#define MATCH_DKADD16 0x1000707f
#define MASK_DKADD16 0xfe00707f
#define MATCH_DKSUB8 0x1a00707f
#define MASK_DKSUB8 0xfe00707f
#define MATCH_DKSUB16 0x1200707f
#define MASK_DKSUB16 0xfe00707f
#define MATCH_DKSLRA8 0x5e00707f
#define MASK_DKSLRA8 0xfe00707f
#define MATCH_DKSLRA16 0x5600707f
#define MASK_DKSLRA16 0xfe00707f
#define MATCH_EXPD80 0x2400707f
#define MASK_EXPD80 0xfff0707f
#define MATCH_EXPD81 0x2410707f
#define MASK_EXPD81 0xfff0707f
#define MATCH_EXPD82 0x2420707f 
#define MASK_EXPD82 0xfff0707f
#define MATCH_EXPD83 0x2430707f
#define MASK_EXPD83 0xfff0707f
//==============END DSP===================//

// n200 interruput cause declaration_
#define CAUSE_SOFT_INT  0x1

// n200 nmi cause declaration_
#define CAUSE_NONMASK_INT 0x2

#define  CSR_MCOUNTERSTOP 0xbff
#define  CSR_ISTATUS      0x310
#define  CSR_NSTATUS      0x311
#define  CSR_MIVEC        0x312
#define  CSR_MSUBMODE     0x314
#define  CSR_MSCRATCH1    0x350
#define  CSR_MNPC         0x351
#define  CSR_MIPC         0x352
#define  CSR_DBGSTOP      0xbfc

#endif
